﻿using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace ESoft.Helpers
{
    public class LibofficeHelper
    {
        static string getLibreOfficePath()
        {
            switch (Environment.OSVersion.Platform)
            {
                case PlatformID.Unix:
                    return "/usr/bin/soffice";
                case PlatformID.Win32NT:
                    return AppSetting.GetString("System", "LibereOfficePath");
                default:
                    throw new PlatformNotSupportedException("你的系统暂不支持！");
            }
        }

        public static bool IsOfficeFile(string officePath)
        {
            var ext = AppSetting.GetString("System", "OfficeExt");
            var extArray = ext.Split(',');
            if (extArray.All(x => x != Path.GetExtension(officePath)))
            {
                return false;
            }
            return true;
        }

        public static bool TryToPdf(string officePath, out string outPutPath)
        {
            outPutPath = string.Empty;
            var ext = AppSetting.GetString("System", "OfficeExt");
            var extArray = ext.Split(',');
            if (extArray.All(x => x != Path.GetExtension(officePath)))
            {
                return false;
            }

            //获取libreoffice命令的路径
            string libreOfficePath = getLibreOfficePath();

            string newPath = AppSetting.GetString("System", "UploadPath") + "/" + DateTime.Today.ToString("yyyyMMdd");
            ProcessStartInfo procStartInfo = new ProcessStartInfo(libreOfficePath, string.Format("--convert-to pdf --outdir {0} --nologo {1}", newPath, officePath));

            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;
            procStartInfo.CreateNoWindow = true;
            procStartInfo.WorkingDirectory = Environment.CurrentDirectory;

            //开启线程
            Process process = new Process() { StartInfo = procStartInfo, };
            process.Start();
            process.WaitForExit();

            if (process.ExitCode != 0)
            {
                throw new LibreOfficeFailedException(process.ExitCode);
            }
            outPutPath = newPath + "/" + Path.GetFileNameWithoutExtension(officePath) + ".pdf";

            return true;
        }
    }

    /// <summary>
    /// 
    /// </summary>
    public class LibreOfficeFailedException : Exception
    {
        public LibreOfficeFailedException(int exitCode)
            : base(string.Format("LibreOffice错误 {0}", exitCode))
        { }
    }
}
